package service

import (
	"context" // 提供上下文功能，用于控制API调用的超时、取消等
	"fmt"     // 提供字符串格式化功能
	"os"      // 提供操作系统功能，此处用于设置环境变量
	"strings" // 提供字符串处理函数，此处用于分割AI返回结果

	// 导入百度千帆大模型SDK，用于调用文心一言等AI模型
	"github.com/baidubce/bce-qianfan-sdk/go/qianfan"
)

// init函数：程序启动时自动执行，用于初始化百度千帆API的鉴权信息
// 作用：设置环境变量存储Access Key和Secret Key，供SDK内部读取进行身份验证
func init() {
	// 设置百度智能云Access Key到环境变量（QIANFAN_ACCESS_KEY为SDK约定的变量名）
	// 注意：实际生产环境中不应硬编码密钥，建议通过配置文件或系统环境变量传入
	err := os.Setenv("QIANFAN_ACCESS_KEY", "ALTAKYipvjqeEdTYIbnvB9BnQc")
	if err != nil {
		return // 若设置失败（如权限问题），直接返回（后续API调用会因鉴权失败报错）
	}

	// 设置百度智能云Secret Key到环境变量（QIANFAN_SECRET_KEY为SDK约定的变量名）
	err = os.Setenv("QIANFAN_SECRET_KEY", "bda8ea87f6f6405797bbbe5a7f88f98c")
	if err != nil {
		return
	}
	// 密钥获取路径：百度智能云控制台 → 用户账户 → 安全认证 → 访问密钥
}

// GetAIAdvice 调用百度千帆大模型API，根据任务信息生成规划和建议
// 参数：
//
//	title: 任务标题（如"完成项目报告"）
//	content: 任务详情（如"包含需求分析和进度总结"）
//	dueTime: 任务截止时间（格式化字符串，如"2024-12-31 23:59"）
//
// 返回值：
//
//	plan: AI生成的任务规划（包含优先级和时间分配）
//	advice: AI生成的执行建议（包含风险点和资源推荐）
//	err: 错误信息（若调用失败则不为空）
func GetAIAdvice(title, content string, dueTime string) (plan string, advice string, err error) {
	// 1. 构造AI提示词（Prompt）
	// 目的：明确告知AI生成内容的格式和要求，确保返回结果可被程序解析
	prompt := fmt.Sprintf(`
# 任务处理指令（严格遵守，否则无效）
1. 仅输出【规划】和【建议】两部分，无标题、无引言、无总结，内容不换行，用"【规划】"和"【建议】"作为唯一分隔符。
2. 基于任务信息和截止时间%s，生成可直接执行的内容，拒绝模糊表述（如"尽快完成"）。

【规划】必须包含：
- 优先级：高/中/低（强制单选），紧跟判断依据（例：高（24小时内截止））；
- 步骤：3-4步（按时间顺序），每步格式为"[动作]（[开始时间]-[结束时间]）→[可量化成果]"（时间需具体到小时，适配截止时间）。
例：[收集用户需求]（09:00-11:00）→完成3条核心需求文档

【建议】必须包含：
- 风险点：2个具体环节（例："需求确认耗时超1小时"），每个风险后跟"→应对：具体措施"；
- 资源：1-2个工具/资料（例："飞书文档→实时协作减少沟通成本"），需说明与任务的关联性。

任务信息：
标题：%s
详情：%s
`, dueTime, title, content)

	// 2. 初始化千帆SDK的聊天客户端
	// NewChatCompletion()是SDK提供的工厂函数，用于创建大模型对话客户端
	client := qianfan.NewChatCompletion()

	// 3. 构造大模型请求参数
	// ChatCompletionRequest是SDK定义的请求结构体，包含对话内容和生成参数
	req := &qianfan.ChatCompletionRequest{
		Messages: []qianfan.ChatCompletionMessage{
			{
				Role:    "user", // 角色为"user"表示这是用户输入的提示词
				Content: prompt, // 传入上面构造的提示词
			},
		},
		Temperature: 0.7, // 生成随机性参数（0-1）：值越小结果越确定，值越大越发散
	}

	// 4. 调用大模型API（同步阻塞调用）
	// context.Background()：使用默认上下文（无超时控制，可改为context.WithTimeout设置超时）
	// Do方法：发送请求并返回响应
	resp, err := client.Do(context.Background(), req)
	if err != nil {
		// 若调用失败（如网络问题、鉴权失败），包装错误信息并返回
		return "", "", fmt.Errorf("大模型调用失败：%v", err)
	}

	// 5. 检查API返回结果是否有效
	if resp.Result == "" {
		return "", "", fmt.Errorf("未获取到有效生成结果")
	}

	// 6. 解析AI返回结果（按提示词约定的格式分割）
	// 按"【建议】"分割字符串，期望得到["【规划】...", "..."]两部分
	parts := strings.Split(resp.Result, "【建议】")
	if len(parts) < 2 {
		// 若分割后不足两部分，说明AI返回格式不符合预期
		return "", "", fmt.Errorf("AI返回格式不符合要求（缺少【建议】）：%s", resp.Result)
	}

	// 提取规划内容：移除"【规划】"前缀，得到纯规划文本
	plan = strings.TrimPrefix(parts[0], "【规划】")
	// 提取建议内容：直接取分割后的第二部分
	advice = parts[1]

	// 返回解析后的结果（无错误）
	return plan, advice, nil
}
